מדריך FAUST שפת תכנות ליישומי אודיו מחולל גל ריבועי פרויקט מס ± FAUST שפת תכנות המיועדת ליישומי עיבוד אות דיגיטלי במחשב בזמן אמת ומאפשרת להמיר אותם אח כ לפלאגינים בפורמט ÆVst ייחודה של השפה בכך שהיא מאפשרת להתמקד ביישום עצמו שרוצים לתכנן מנקודת מבט של sound design בלי לשבור את הראש עם קוד c על כל המשתמע מכךÆ זה אומר שאחרי הכרות עם השפה מה שדורש השקעה אפשר להקדיש את מרבית הזמן לצד המוזיקלי יצירתי ולא התכנותיÆ איזה כיף אקטמוזיקלי מדריכים מאת חברי הפורום act.co.il
מדריך יצירת מחולל גל ריבועי באמצעות תוכנת פאוסט עבור חברי הפורום אקט מוזיקלי מאת איתמר כץ חבר פורום אקט מוזיקלי http://faust.grame.fr תוכנת פאוסט מתוך אתר האינטרנט What is FAUST? FAUST is a compiled language for real-time audio signal ing. The name FAUST stands for Functional AUdio STream. Its programming model combines two approaches: functional programming and block diagram composition. You can think of FAUST as a structured block diagram language with a textual syntax. What is FAUST intended for? FAUST is intended for developers who need to develop efficient C/C++ audio plugins for existing systems or full standalone audio applications. Thanks to some specific compilation techniques and powerful optimizations, the C++ code generated by the Faust compiler is usually very fast. It can generally compete with (and sometimes outperform) hand-written C code. What does it look like? Programming with FAUST is somehow like working with electronic circuits and signals. A FAUST program is a list of definitions that defines a signal or block-diagram : a piece of code that produces output signals according to its input signals (and maybe some user interface parameters). How does it work? Faust is a compiled language translated to C++. In order to generate the most efficient code, the compilation is based on a semantic approach. Instead of compiling directly the block-diagram as described by the user, the idea is to compile its mathematical meaning (what it actually computes).
FAUST שפת תכנות ליישומי אודיו מחולל גל ריבועי פרוייקט מס ± הקוד בפרוייקט זה הוא בן µ שורות בלבד אך הוא מכיל הרבה מידע לגבי עקרונות בסיסיים של השימוש ב ÆFaust בעיקרון כדי להבין את הקוד בפרוייקט הזה דרוש ידע מתמטי בסיסי וידע קצת יותר מבסיסי בעיבוד אות אבל אני מקווה שעם קצת סבלנות וסקרנות אפשר להבין אותו גם ללא ידע כזהÆ יאללה מתחיליםÆÆÆ מאת איתמר כץ בפרוייקט הראשון המטרה שלנו היא ליצור מחולל גל ריבועי פשוט עם שליטה על התדר של הגל ועל היחס בין החלק החיובי והשלילי במחזור cycle Æ duty ה cycle duty מודגם באיור ±Æ איור ± שליטה על תדר הגל ועל היחס בין החלק החיובי והשלילי במחזור התרשים מתוך אתר וויקיפדיה wikipedia.org/wiki/duty_cycle 3
מחולל גל ריבועי פרויקט מס ± רכיבים בסיסיים בהם נשתמש מומלץ מאוד לנסות לקמפל את כל הדוגמאות במסמך זה באתר של Faust אובייקט גרפי מסוג slider נוצר ע י הפקודה vslider עבור סליידר אנכי או hslider עבור סליידר אפקיÆ התחביר זהה לשתי הפקודות איור פקודה זו יוצרת משתנה בשם slider± סליידר אופקי עם תוית המכילה את הטקסט label טקסט שיופיע ליד הסליידר Æ הערכים שהסליידר מקבל נעים בין min ל max הערך ההתחלתי הוא start והקפיצה המינימלית בין ערכים היא Æstep בדיאגרמה זה נראה כך איור איור תחביר ליצירת סליידר בדוגמה זו סליידר אופקי slider1 = hslider( label, start, min, max, step); איור hslider( Period, 1, 0.1, 100, 0.1) חיבור חיסור כפל חילוק ע י הסימנים הרגילים כלומר Ø כאשר כל סימן מייצג קופסה עם שתי כניסות ויציאה אחת או במילים אחרות פונקציה המקבלת שני משתנים ומוציאה אחדÆ בחיסור וחילוק יש חשיבות לסדר המשתנים לכן בדיאגראמה תופיע נקודה שחורה ליד הכניסה הראשונה מה שמקל על זיהוי הכניסותÆ התחביר יכול להיות תחביר מתמטי רגיל A B A B או תחביר של פונקציה המקבלת שני משתנים או תחביר של שתי כניסות המחוברות בטור ראה בהמשך לקופסת חיסור A B בכל המקרים התוצאה זהה איור נשים לב שבגלל ש A ו B הוגדרו להיות סיגנלים קבועים הציור מייצג קופסה עם אפס כניסות ויציאה אחתÆ איור A B 3-1 4
FAUST שפת תכנות ליישומי אודיו איור µ חיבור בטור A * B int A B חיבור בטור שורה זו מחברת את היציאה או היציאות של A בטור לכניסה או כניסות של ÆB לדוגמה נניח ש A הוא קופסה שמבצעת כפל ולכן יש לה כניסות ויציאה אחת ו B קופסה שהופכת את הכניסה ל integer כניסה אחת יציאה אחת כפי שמתואר באיור µ איור פידבק B - A 1 A B מודולו mod התוצאה היא השארית של חלוקת A ב ÆB זו קופסה עם כניסות ויציאה אחתÆ גם כאן אפשר להשתמש בתחביר של פונקציה כלומר Æ A B כמו בחיסור וחילוק יש חשיבות לסדר הכניסותÆ A ~ B רקורסיה\פידבק המשמעות של פעולה זו היא קח את המוצא של A הכנס אותו ל B ואת המוצא של B הכנס בחזרה ל Æ A זה אומר שב A חייבות להיות מספיק כניסות פנויות כדי לקבל את היציאות של ÆB A ª לדוגמה הקוד הבא B _ ± ª A~B ª + מגדיר את A להיות קופסת חיבור ואת B להיות קופסת חיסור עם ± בכניסה השניה ו כלום בכניסה הראשונה זהו סימן ה _ שמייצג חוט חשמל שרק מעביר את המידע הלאה כפי שניתן לראות באיור Æ ה כל קוד Faust חייב להסתיים בהגדרת ה שהוא המוצא של התכנית מוגדר להיות חיבור רקורסיבי של A לעצמו דרך ÆB המרובע הקטן שנמצא בתחילת המסלול לפידבק ביציאה מקופסת החיבור מסמן דיליי של דגימה בודדת שכן אחרת נקבל מה שנקרא delay free loop כלומר לופ סגור עם דיליי אפס לאורכו וזה חסר משמעותÆ לכן בכל פידבק הקומפיילר מכניס אוטומטית דיליי של דגימה אחת והמרובע מזכיר לנו את זהÆ A B חיבור במקביל התוצאה היא קופסה שבה הכניסות הן כל הכניסות של A וכל הכניסות של B והיציאות הן כל היציאות של A וכל היציאות של ÆB פעולות השוואה בין שני גדלים º æ º æ כל פעולה כזו היא קופסה עם שתי כניסות בחלקן יש חשיבות לסדר כלומר AæB זה לא כמו BæA ויציאה אחת שהיא או אחד בהתאם לתוצאת ההשוואהÆ יש לשים לב ולהפריד ע י רווח אם משתמשים ביחד עם פעולת החיבור בטור כי הסימון º הוא פעולה אחרת לגמריÆ 5
מחולל גל ריבועי פרויקט מס ± הקוד עצמו סופסוףÆÆÆ ØØ ØØ A square wave oscillator ØØ T hslider Period ± Ʊ ± Ʊ ª ØØ Period ms N ± Æر Æ T intª ØØ The period in samples a hslider Cyclic ratio Ƶ ± Ʊ ª ØØ Cyclic ratio i ± ~ N ± ª ØØ ± ÆÆÆÆÆ n i n a º ± ª נבחן את הקוד הבא נשים לב שורות שמתחילות ב ØØ הן הערות שהקומפיילר מתעלם מהןÆ השורה האחרונה מגדירה מה התכנית מוציאה כל קוד חייב להכיל הגדרה למשתנה שמייצג בעצם את הפלט של התכנית אחרת נקבל הודעת שגיאהÆ זה נכון כבובן גם כשמנסים לקמפל את הדוגמאות במסמך זהÆ ב Faust כל משתנה הוא סיגנל המכיל אינסוף ערכים ולא ערך בודדÆ לכן משתנה שערכו ± הוא בעצם סיגנל קבוע ± ± ± ± וכו Æ איור תרשים לתת הבלוק המייצג את השורה הרביעית בקוד N % 100 1-1 + את הפקודה N ~ ± אפשר להבין אם ניזכר בתחביר של ÆA~B כאן ± A ו N ÆB A הוא קופסת חיבור שיש לה ± בכניסה התחתונה ואילו הכניסה העליונה כביכול חסרה הפונקציה קיבלה רק משתנה אחד במקום שניים בתוך הסוגריים Æ הסיבה היא שקופסת החיבור מחוברת בפידבק בחזרה לעצמה דרך B שהוא הקופסה מודולו N בציור כאן בחרתי אותו להיות ± אבל בתכנית הוא נקבע ע י הסליידר Æ T המוצא של קופסת החיבור מחובר בטור לקופסה שמחסרת ±Æ עכשיו נראה מה בעצם מייצר הבלוק הנ ל בזמן t הזמן נמדד בדגימות נכנס לקופסת החיבור ± לכניסה התחתונה ועדיין כלום לכניסה העליונה זיכרו את הדיליי של דגימה אחת Æ אם אין כלום בכניסה הקופסה מפרשת את זה כ ומקבלים ± ± במוצאÆ ב t ± נכנס שוב ± לכניסה הראשונה ו ± ± גם בקופסת המודולו חשוב מי הכניסה העליונה וגם כאן היא נמצאת ליד הנקודה השחורה כלומר נקבל Æ ± ± כך שוב ושוב עד שקופסת המודולו מוציאה וזה קורה ב ± ± והספירה מתחילה מחדשÆ לבסוף מחסירים ± מהסיגנל כדי לקבל ÆÆÆ ± במקום ÆÆÆ ± 6
FAUST שפת תכנות ליישומי אודיו השורה הראשונה שאינה הערה מייצרת סליידר בשם T עם כותרת Period שזה פשוט טקסט שיופיע ליד הסליידרÆ הסליידר T יכול לקבל ערכים בין ±Æ ל ± הערך ההתחלתי הוא ± והקפיצה המינימלית היא Æ Æ± בסוף השורה יש הערה שמזכירה לנו מה תפקיד הסליידר זמן מחזור במילי שניותÆ השורה השנייה מגדירה את המשתנה N שהוא זמן המחזור של הגל הריבועי ב Æsamples אנו מניחים שתדר הדגימה הוא ± וה ± ממיר ממילי שניות לשניותÆ הנקודה בסוף של מספר מגדירה אותו להיות float ולא Æinteger את התוצאה מכניסים בטור לקופסה שעושה cast למספר שלם Æ integer השורה שלישית מייצרת סליידר בשם a שקובע את ה cycle duty להיות בין ל ± Æ השורה הרביעית מייצרת משתנה בעצם סיגנל שרץ מ ועד ± N ואז חזרה ל וחוזר חלילהÆ איור ממחיש כיצד ניראה תת הבלוק שמייצג שורה זו השורה האחרונה מגדירה את המוצא שאמור להיות גל ריבועי וזה עובד כך אם יש N דגימות במחזור ו a הוא מספר בין ל ± שקובע את ה cycle duty אז המכפלה N a אומרת כמה דגימות צריך הסיגנל לבלות בחלק החיובי של המחזור ה גג של הגל הריבועי Æ הפקודה æ i N a משווה בין הסיגנל i שהוא ÆÆ ± עד ± N לגודל N a ומוציאה ± אם i יותר גדול ו אם אינו יותר גדולÆ כך קיבלנו סיגנל שהוא ± בחלק החיובי של הגל הריבועי ו בחלק השליליÆ מה שנותר הוא לאפס את ה DC כלומר לכפול ב ולהחסיר ± כדי לקבל גל ריבועי שנע בין ± ל ± Æ זה הכל בינתיים כמו שאמרתי רצוי לנסות ולקמפל את כל הדוגמאות וכמובן גם את הקוד עצמו באתר לבחון את הדיאגרמות שמתקבלות ולוודא שהכל מובןÆ בהצלחהÆ 7